package com.yc.ServerClient;


import java.io.PrintWriter;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/***
 * 多线程版——runnable_thread
 */
public class Test6_talkServer_Runnable {

    public static void main(String[] args) {
        ServerSocket ss = null;
        for (int i = 10000; i < 65535; i++) {
            try {
                //完成一台时间服务  选择合适端口的工作
                ss = new ServerSocket(i);
                break;//打断 循环
            } catch (Exception ex) {
                ex.printStackTrace();
                if (ex instanceof BindException) {
                    System.out.println("端口:" + i + "已经被占用");
                }
            }
        }

        System.out.println(ss.getInetAddress().getHostName() + "启动了，监听了端口号：***" + ss.getLocalPort() + "***");

        //客户端通过键盘录入聊天信息
        while (true) {
            try{
                Socket s=ss.accept();
                System.out.println("客户端:"+s.getRemoteSocketAddress()+"联接上来了");
                TalkTask tt=new TalkTask( s );
                Thread t=new Thread( tt );
                t.start();
            }catch (Exception e){
                e.printStackTrace();
            }
        }

    }
}

class TalkTask implements Runnable{
    //套接字流
    private Socket s;

    Scanner keyboard=new Scanner(System.in); //键盘的标准输入流

    public TalkTask(Socket s) {
        this.s = s;
    }

    @Override
    public void run(){
        try(
                Socket s=this.s; //为什么要在这里重新赋值一次？ 因为语法规定try 要自动关闭的流必须在try()声明

                //套接字流
                Scanner clientReader=new Scanner(s.getInputStream());// Scanner.nextLine();  按\n来读取
                PrintWriter pw=new PrintWriter(s.getOutputStream()); ){ //PrintWriter.writerLine(); ->输出数据\n
            do{
                String response=clientReader.nextLine();
                System.out.println("客户端:"+s.getRemoteSocketAddress()+"对server说:"+response);
                if("bye".equalsIgnoreCase(response)){
                    System.out.println("客户端:"+s.getRemoteSocketAddress()+"主动断开与服务器的联接:");
                    break;
                }

                System.out.println("请输入服务器想对客户端"+s.getRemoteSocketAddress()+"说的话：");
                String line=keyboard.nextLine();
                //用输出流将响应返回客户端
                pw.println(line);
                pw.flush();

                if("bye".equalsIgnoreCase(line)){
                    System.out.println("服务器要求主动断开与客户端"+s.getRemoteSocketAddress()+"的联接");
                    break;
                }
            }while(true);

        }catch (Exception ex){
            ex.printStackTrace();
        }
        System.out.println("在服务端正常结束与客户端"+s.getRemoteSocketAddress()+"聊天...");
    }
}
